<?php
/**
 * Game_Battle_Reinforcement
 *
 * Класс Game_Battle_Reinforcement отвечает за подкрепления
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Game_Battle_Reinforcement extends Game_Battle_Move {
	
	protected $_battleType = 'reinforcement'; // тип сражения (это может быть и подкрепление)
	
	/**
	 * Создает новый объект для расчета сражения
	 *

	 * @param Game_Place $objPlaceGoal - место, в котороt пребывают войска
	 * @param Game_Unit_UnitsGroup $objSentGroup - Группа отправленных войск
	 * @param bool $isAutoCalculate - флаг, производить ли посдечт сразу
	 * 
	 */
	public function __construct(Game_Place $objPlaceGoal, Game_Unit_UnitsGroup $objSentGroup, $isAutoCalculate = true) {
		parent::__construct($objPlaceGoal, $objSentGroup);
		
		if ($isAutoCalculate) $this->calculate();

	}
	
	
	/**
	 * Вычисляет результаты подкрепления
	 */
	public function calculate() {
		// Если получатель и отправитель - разные места
		if ($this->_objPlaceSender->id != $this->_objPlaceGoal->id) {
			$stmtUpdateOwnerRows = "";
			$stmtInsertGoalValues = "";
			$arrResearchedUnitsInfo = $this->_objPlaceSender->getUnitsStatuses();
			foreach ($this->_objSentGroup->getUnitsInGroup() as $arrUnitReinforcement) {
				$stmtUpdateOwnerRows .= "
					WHEN `ID_unit` = '" . $arrUnitReinforcement['ID_unit'] . "'
					THEN `amount` - " .  $arrUnitReinforcement['amount'] . "
				";
				$stmtInsertGoalValues .= "(
					'" . $this->_objPlaceGoal->id . "', '" . $this->_objPlaceSender->id . "', '" . $arrUnitReinforcement['ID_unit'] . "',
					'" . $arrUnitReinforcement['amount'] . "', '" . $arrResearchedUnitsInfo[$arrUnitReinforcement['ID_unit']]->getLevel() . "'
				)";
			}
			$objDb = Service_Database::instance();
			
			// Обновляем данные в точке отправления
			$stmtUpdateOwner ="
				UPDATE `place_unit_amount`
				SET `amount` =
				CASE
					" . $stmtUpdateOwnerRows . "
				ELSE `amount`
				END
				WHERE `ID_place` = '" . $this->_objPlaceSender->id ."' AND `ID_place_owner` = '" . $this->_objPlaceSender->id ."'
			";
			$objDb->query($stmtUpdateOwner);
			
			// Обновляем данные в точке прибытия
			$stmtInsertGoal = "
				INSERT INTO `place_unit_amount` (
					`ID_place`, `ID_place_owner`, `ID_unit`,
					`amount`, `unit_level`
				)
				VALUES " . $stmtInsertGoalValues . "  ON DUPLICATE KEY UPDATE
					`amount` = `amount` + VALUES(`amount`)
			";
			$objDb->query($stmtInsertGoal);
			
			// Сохраняем объект битвы
			$battleId = $this->_saveBattleEssence();
			
			// Сохраняем "ссылки на отчеты" для каждого из пользователей
			$this->_saveBattleUsersInfo($battleId);
			
			// Сохраняем информацию по перемещенным юнитам
			$this->_saveBattleUnitsInfo($battleId);
			
			$this->_objPlaceSender->calculateAndUpdateDynamicConsumption();
			$this->_objPlaceGoal->calculateAndUpdateDynamicConsumption();
		} 
		else {
			$objUnitGroupResources = new Game_Unit_GroupResource($this->_objSentGroup->id);
			// Если есть перевозимые ресурсы, то инкрементим их
			if ($objUnitGroupResources->id) {
				$objResources = new Game_Resource($objUnitGroupResources);
				$this->_objPlaceGoal->objResourcesWithProduction->increase($objResources);
				$this->_objPlaceGoal->calculateAndUpdateDynamicConsumption();
			}
		}

		
		// Удаляем группу отправки
		$this->_objSentGroup->delete();
	}
}
?>